// 某停车场，分3层，每层100个车位
// 每个车位都能监控到车辆的驶入和离开
// 车辆进入前，显示每层的空余车位数量
// 车辆进入时，摄像头可识别车牌号和时间
// 车辆出来时，出口显示器显示车牌号和停车时长

// 车辆
class Car {
  constructor(num) {
    this.num = num;
  }
}
// 摄像头
class Camera {
  shot(car) {
    return {
      num: car.num,
      inTime: Date.now(),
    };
  }
}
// 出口显示屏
class Screen {
  show(car, inTime) {
    console.log(`车牌号：${car.num}`);
    console.log(`停车时间：${Date.now() - inTime}`);
  }
}

// 停车场
class Park {
  constructor(floors) {
    this.floors = floors || [];
    this.camera = new Camera();
    this.screen = new Screen();
    this.carList = {}; // 存储摄像头拍摄返回的车辆信息
  }
  in(car) {
    // 通过摄像头获取信息
    const info = this.camera.shot(car);
    // 此时info:{
    //     +num,
    //     +inTime
    // }
    // 停到某个停车位
    const i = parseInt((Math.random() * 100) % 100);
    const place = this.floors[0].places[i];
    place.in();
    info.place = place;
    // 此时info:{
    //     +num,
    //     +inTime
    //     +place:{
    //          +empty:Boolean,
    //          +in(),
    //          +out(),
    //     }
    // }
    // 记录信息
    this.carList[car.num] = info;
  }
  out(car) {
    // 获取信息
    const info = this.carList[car.num];
    const place = info.place;
    // 车开走，将停车位清空
    place.out();
    // 显示车辆信息和停车时间
    this.screen.show(car, info.inTime);
    // 清空记录
    delete this.carList[car.num];
  }
  emptyNum() {
    return this.floors
      .map((floor) => {
        return `第 ${floor.index} 层还有 ${floor.emptyPlaceNum()} 个空闲车位`;
      })
      .join("\n");
  }
}
// 层
class Floor {
  constructor(index, plcase) {
    this.index = index;
    this.places = plcase || [];
  }
  emptyPlaceNum() {
    // 显示这一层有多少停车位
    let num = 0;
    this.places.forEach((p) => {
      if (p.empty) {
        num = num + 1;
      }
    });
    return num;
  }
}
// 车位
class Place {
  constructor() {
    this.empty = true;
  }
  in() {
    this.empty = false;
  }
  out() {
    this.empty = true;
  }
}
// 测试
// 初始化停车场
const floors = [];
for (let i = 0; i < 3; i++) {
  const places = [];
  for (let j = 0; j < 100; j++) {
    places[j] = new Place();
  }
  floors[i] = new Floor(i + 1, places);
}
const park = new Park(floors);

// 初始化车辆
const car1 = new Car("京A10000");
const car2 = new Car("京B20000");
const car3 = new Car("京C30000");

console.log("第一辆车进入");
console.log(park.emptyNum());
park.in(car1);
console.log("第二辆车进入");
console.log(park.emptyNum());
park.in(car2);
console.log("第一辆车离开");
park.out(car1);
console.log("第二辆车离开");
setTimeout(() => {
  park.out(car2);
}, 200);

console.log("第三辆车进入");
console.log(park.emptyNum());
park.in(car3);
console.log("第三辆车离开");
park.out(car3);
